use log::LevelFilter;
use std::fs;
use std::path::PathBuf;
use dirs;

/// 应用配置
#[derive(Debug)]
pub struct AppConfig {
    pub log_level: String,
    pub app_name: String,
}

/// 初始化日志系统
pub fn setup_logging(config: &AppConfig) -> Result<(), Box<dyn std::error::Error>> {
    // 创建日志目录
    let log_dir = get_log_directory();
    fs::create_dir_all(&log_dir)?;

    // 日志文件路径
    let log_file = log_dir.join("chartsmanager.log");

    // 配置日志记录器
    let log_level = match config.log_level.as_str() {
        "trace" => LevelFilter::Trace,
        "debug" => LevelFilter::Debug,
        "info" => LevelFilter::Info,
        "warn" => LevelFilter::Warn,
        "error" => LevelFilter::Error,
        _ => LevelFilter::Info,
    };

    // 设置日志记录到文件和控制台
    fern::Dispatch::new()
        .format(|out, message, record| {
            out.finish(format_args!(
                "{} [{}] {}",
                chrono::Local::now().format("%Y-%m-%d %H:%M:%S"),
                record.level(),
                message
            ))
        })
        .level(log_level)
        .chain(std::io::stdout())
        .chain(fern::log_file(log_file)?)
        .apply()?;

    log::info!("{} 应用正在启动...", config.app_name);
    log::info!("日志级别: {}", config.log_level);
    log::info!("日志文件路径: {:?}", get_log_directory().join("chartsmanager.log"));

    Ok(())
}

/// 获取日志目录路径
fn get_log_directory() -> PathBuf {
    // 在用户目录下创建 .chartsmanager/logs 目录
    dirs::home_dir()
        .unwrap_or_else(|| PathBuf::from("."))
        .join(".chartsmanager")
        .join("logs")
}